![]() ![]() |
背景Mac OS X 10.3 では、Cocoa ビュー用に最適化した描画モデルが導入されました。このモデルは新しい NSView メソッドの -getRectsBeingDrawn:count: と -needsToDrawRect: によってサポートされており、ビューの描画をコンテンツ領域において更新する必要のある部分に正確に限定することができます。これら新しいメソッドの使用については、「Drawing and Views」のサブトピック、「Constraining Drawing to Improve Performance」で詳しくされています。 -needsToDrawRect: メソッドは、ビューの -drawRect: の実装が、コンテンツ領域内の特定のオブジェクトを描画する必要があるかどうかを調べるための便利な手段として提供されています。-needsToDrawRect: にオブジェクトの境界矩形を渡すと、この矩形が再表示を必要とするビューの一部と重なっている場合は YES が返されます。 問題点効率化のために、NSView の -needsToDrawRect: の実装はまず、渡された矩形が、描画する領域の境界ボックスと重なるかどうかをテストします。場合によっては(ほとんどはビューにテキストを描画する場合)、この境界矩形の計算に間違いが生じ、その結果 -needsToDrawRect: が間違って NO を返し、結果に応じて描画を行う処理が実行されません。 -needsToDrawRect: をオーバーライドして正しく実行この問題を回避して意図したとおりに動作させるには、-needsToDrawRect: を使用するカスタムビュークラスにおいて、-needsToDrawRect: をオーバーライドします。 ビューが一度に多数の矩形を描画するよう要求されることがめったになく、そのコンテンツを描画するのが特に複雑または高価でない場合は、次のような -needsToDrawRect: の再実装で十分です。
上記のアプローチには、 -needsToDrawRect: を呼び出すコードを変更する必要がないという利点があります。 通常、一度に描画する矩形が多数あるビューの場合にパフォーマンスを改善するには、このメソッドで rectList の境界矩形の外側にあるオブジェクトを迅速に拒否する、別のメソッドを定義して使用することが考えられます。-needsToDrawRect: の代わりに次のメソッドを呼び出し、"rectListBounds" パラメータとして -drawRect: の矩形パラメータを渡します。
|